package states;

import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import management.BotoMenu;
import management.DBAccess;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.gui.AbstractComponent;
import org.newdawn.slick.gui.ComponentListener;
import org.newdawn.slick.state.BasicGameState;
import org.newdawn.slick.state.StateBasedGame;

public class MainMenuState extends BasicGameState {

    public static final int ID = 0;
    public DBAccess dba = new DBAccess();
    // Contenidor del joc
    private GameContainer container;
    // Contenidor d'estats que s'usara per accedir als estats necessaris
    private StateBasedGame state;
    private BotoMenu botoNovaPartida;
    private BotoMenu botoCarregarPartida;
    // private BotoMenu botoOpcions;
    private BotoMenu botoContinuarPartida;
    private int canviAEstat;
    private int comptador = 0;
    // Boto per sortir del joc
    private BotoMenu botoSortir;
    // ArrayList per moure tots els botons quan sigui necessari
    private ArrayList<BotoMenu> botons;
    // Imatge del fons de pantalla
    private Image imatgeFons;
    private Image imatgeBotoContinuar;
    private Image imatgeBotoContinuarOver;
    private Image imatgeCarregar;
    private Image imatgeCarregarOver;
    private Image imatgeNovaPartida;
    private Image imatgeNovaPartidaOver;
    private Image imatgeBotoSortir;
    private Image imatgeBotoSortirOver;

    @Override
    public int getID() {
        return ID;
    }

    public void init(GameContainer gc, StateBasedGame sbg) throws SlickException {

       this.container = gc;
       this.state = sbg;
       imatgeFons = dba.recuperarMenuResource("fonsMenu");
       imatgeBotoContinuar = dba.recuperarMenuResource("botoContinue");
       imatgeBotoContinuarOver = dba.recuperarMenuResource("botoContinueOver");
       imatgeNovaPartida = dba.recuperarMenuResource("botoNewGame");
       imatgeNovaPartidaOver = dba.recuperarMenuResource("botoNewGameOver");
       imatgeCarregar = dba.recuperarMenuResource("botoCarregar");
       imatgeCarregarOver = dba.recuperarMenuResource("botoCarregarOver");
       imatgeBotoSortir = dba.recuperarMenuResource("btnSortir");
       imatgeBotoSortirOver = dba.recuperarMenuResource("btnSortirSelected");
    }

    public void render(GameContainer gc, StateBasedGame sbg, Graphics grphcs) throws SlickException {
        imatgeFons.draw(0, 0);
        botoContinuarPartida.render(gc, grphcs);
        botoNovaPartida.render(gc, grphcs);
        botoCarregarPartida.render(gc, grphcs);
        botoSortir.render(gc, grphcs);
    }

    /**
     * Es reinicia el valor de les variables usades en aquest estat
     */
    private void reiniciarVariables() {
        botons = new ArrayList<BotoMenu>();
        canviAEstat = 0;
    }

    /**
     * En aquest metode es creen els botons que es mostraran en el menu principal
     * A través del manager de recursos assignem una imatge i una posicio als botons
     */
    private void crearBotonsMenuNormal() {
        botoContinuarPartida = new BotoMenu(container, imatgeBotoContinuar, 600, 300);
        botoContinuarPartida.setMouseOverImage(imatgeBotoContinuarOver);
        botons.add(botoContinuarPartida);
        botoNovaPartida = new BotoMenu(container, imatgeNovaPartida, 600, 350);
        botoNovaPartida.setMouseOverImage(imatgeNovaPartidaOver);
        botons.add(botoNovaPartida);
        botoCarregarPartida = new BotoMenu(container, imatgeCarregar, 600, 400);
        botoCarregarPartida.setMouseOverImage(imatgeCarregarOver);
        botons.add(botoCarregarPartida);
        botoSortir = new BotoMenu(container, imatgeBotoSortir, 600, 450);
        botoSortir.setMouseOverImage(imatgeBotoSortirOver);
        botons.add(botoSortir);
    }

    /**
     * S'afegeixen els listeners que faran accionar els botons
     */
    private void afegirListeners() {
        botoContinuarPartida.addListener(new ComponentListener() {

            public void componentActivated(AbstractComponent ac) {
               if(state.getState(GamePlayState.ID) != null){
                   state.enterState(GamePlayState.ID);
               }
            }
        });


        botoCarregarPartida.addListener(new ComponentListener() {

            public void componentActivated(AbstractComponent source) {


                    state.enterState(LoadGameState.ID);


            }
        });

        botoNovaPartida.addListener(new ComponentListener() {

            public void componentActivated(AbstractComponent comp) {
                try {
                    state.init(container);
                    state.enterState(LoadingState.ID);
                } catch (SlickException ex) {
                    Logger.getLogger(MainMenuState.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });

        botoSortir.addListener(new ComponentListener() {

            public void componentActivated(AbstractComponent comp) {
                container.exit();
            }
        });
    }

    /**
     * El motor s'encarrega de cridar aquest metode, aqui s'actualitzaran dades de variables o objectes
     * que s'estiguin usant en aquest estat
     * @param container
     * @param game
     * @param delta
     * @throws SlickException
     */
    public void update(GameContainer game, StateBasedGame state, int delta) {
        botoNovaPartida.setActiu(true);
        botoContinuarPartida.setActiu(true);
        botoCarregarPartida.setActiu(true);
        botoSortir.setActiu(true);
        comptador = 0;
        if (game.getInput().isKeyPressed(Input.KEY_ESCAPE)) {
            game.exit();
        }
    }

    /**
     * Es fa un override del metode enter, el qual es crida cada vegada que s'entra a l'estat
     * @param gc : context on es situa l'estat actual
     * @param state : estat actual
     */
    @Override
    public void enter(GameContainer gc, StateBasedGame state) {
        reiniciarVariables();
        crearBotonsMenuNormal();
        afegirListeners();
    }

    /**
     * Es fa un override del metode leave, el qual es crida cada vegada que es surt de l'estat
     * @param gc
     * @param state
     */
    @Override
    public void leave(GameContainer gc, StateBasedGame state) {
        comptador = 0;
    }
}